www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/GameLib/dialog/dialog.cpp

    //Download by http://www.NewXing.com
#include <ddraw.h>
#include "..\\..\\main.h"
#include "dialog.h"

void CALLBACK DialogTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);

RLEBITHEADER * SelectRLE;
RLEBITHEADER * DialogRLE;
bool DialogSelect = false;
int DialogSelectNum = 0;
char *dialog_text;

int Dialog_func(char *text)
{
	MSG msg;
	DialogSelect = false;
	dialog_text = text;
	SelectRLE = LoadRleImage("pic\\interface\\exittext.ret");
	DialogRLE = LoadRleImage("pic\\dialog\\dialog2.ret");
	rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	FastBlt(0, 0, rect1, pS[SBack], pS[SBuffer], SP[SBack], SP[SBuffer], false, 0);
	cursor = 0;
	PA_SAFE_DELETE(mouseRLE);
	mouseRLE = LoadRleImage("Pic\\cursor\\cursor01.ret");
	cursorT = 4;
	SetTimer(hwnd, 1, 50, DialogTimer);
	while(!DialogSelect)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if ( msg.message==WM_QUIT)
				break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else 
		{	
			DialogRefreshScreen();
		}			
	}
	KillTimer(hwnd, 1);
	PA_SAFE_DELETE(SelectRLE);
	PA_SAFE_DELETE(DialogRLE);
	return DialogSelectNum;
}

LRESULT WINAPI DialogMessageProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_SETCURSOR:
		SetCursor(NULL);
		break;
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:
			DialogSelectNum = 2;
			DialogSelect = true;
			break;
		default:
			return 1;
		}
		break;
	case WM_LBUTTONDOWN:
		if(DialogSelectNum != 0)
		{
			DialogSelect = true;
		}
		break;
	case WM_MOUSEMOVE:
		curpos.x = LOWORD (lParam);
		curpos.y = HIWORD (lParam);
		if(curpos.x > SCREEN_WIDTH - 1 )
		{
			curpos.x = SCREEN_WIDTH-1;
			SetCursorPos(curpos.x, curpos.y);
		}
		if(curpos.y > SCREEN_HEIGHT - 1)
		{
			curpos.y = SCREEN_HEIGHT-1;
			SetCursorPos(curpos.x, curpos.y);
		}
		break;
    default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 1;
}

void DialogRefreshScreen()
{
	HDC hdc;
	CFont cFont;
	FastBlt(0, 0, rect1, pS[SBuffer], pS[SBack], SP[SBuffer], SP[SBack], false, 0);
	ShowRleImage_NR((SCREEN_WIDTH-DialogRLE->bfWidth)/2, (SCREEN_HEIGHT-DialogRLE->bfHeight)/2, 0, 0, DialogRLE, pS[SBuffer], SP[SBuffer]);
	DDS[SBuffer]->GetDC(&hdc);
	cFont.UseFont(hdc,DCF_USERDEFINE, 20, 800);
	TEXTMETRIC tm;
	GetTextMetrics(hdc,&tm);
	ShowText(hdc, (SCREEN_WIDTH - tm.tmAveCharWidth*strlen(dialog_text))>>1,(SCREEN_HEIGHT>>1)-tm.tmHeight-tm.tmExternalLeading-10, RGB(255,255,0), dialog_text);
	cFont.RestoreFont(hdc);
	DDS[SBuffer]->ReleaseDC(hdc);
	if((curpos.y > SCREEN_HEIGHT/2+5)&&(curpos.y < SCREEN_HEIGHT/2+41))
	{
		if((curpos.x > (SCREEN_WIDTH-DialogRLE->bfWidth/2)/2+10)&&(curpos.x < (SCREEN_WIDTH-DialogRLE->bfWidth/2)/2 + 44))
		{
			if(DialogSelectNum != 1)
			{
				DialogSelectNum = 1;
			}
			
			ShowRleImage_NR((SCREEN_WIDTH-DialogRLE->bfWidth/2)/2+10, SCREEN_HEIGHT/2, 2, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
			ShowRleImage_NR((SCREEN_WIDTH+DialogRLE->bfWidth/2)/2-25, SCREEN_HEIGHT/2, 1, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
		}
		else 
		{
			ShowRleImage_NR((SCREEN_WIDTH-DialogRLE->bfWidth/2)/2+10, SCREEN_HEIGHT/2, 0, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
			if((curpos.x > (SCREEN_WIDTH+DialogRLE->bfWidth/2)/2-25)&&(curpos.x < (SCREEN_WIDTH+DialogRLE->bfWidth/2)/2 + 9))
			{
				if(DialogSelectNum != 2)
				{
					DialogSelectNum = 2;
				}
				ShowRleImage_NR((SCREEN_WIDTH+DialogRLE->bfWidth/2)/2-25, SCREEN_HEIGHT/2, 3, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
			}
			else 
			{
				ShowRleImage_NR((SCREEN_WIDTH+DialogRLE->bfWidth/2)/2-25, SCREEN_HEIGHT/2, 1, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
				DialogSelectNum = 0;
			}
		}
	}
	else
	{
		ShowRleImage_NR((SCREEN_WIDTH-DialogRLE->bfWidth/2)/2+10, SCREEN_HEIGHT/2, 0, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
		ShowRleImage_NR((SCREEN_WIDTH+DialogRLE->bfWidth/2)/2-25, SCREEN_HEIGHT/2, 1, 0, SelectRLE, pS[SBuffer], SP[SBuffer]);
		DialogSelectNum = 0;
	}

	RECT rect3;
	long lW, lH;
	lW = mouseRLE->bfWidth/mouseRLE->bfWidthBitN;
	lH = mouseRLE->bfHeight/mouseRLE->bfHeightBitN;

	rect3.left = 0;
	rect3.top  = 0;
	rect3.right = curpos.x+lW > SCREEN_WIDTH?SCREEN_WIDTH-curpos.x:lW;
	rect3.bottom = curpos.y+lH > SCREEN_HEIGHT?SCREEN_HEIGHT-curpos.y:lH;
	ShowRleImage(curpos.x, curpos.y, cursor, 0, rect3, mouseRLE, pS[SBuffer], SP[SBuffer]);
	UpdateScreen();
}

void CALLBACK DialogTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
}